﻿package com.teaphy.coroutinecrawler.exception

import kotlinx.coroutines.*

fun main() = runBlocking {

    println("runBlocking --> start")

    // CoroutineExceptionHandler是CoroutineContext的元素，可用于处理协程中的未捕获异常,
    // 及其所有可能自定义了异常处理的子协程。它类似于 Thread.uncaughtExceptionHandler 。
    // 但，其不会处理向用户暴露的异常。
    //
    // 尽管已经处理的异常，却无法从 CoroutineExceptionHandler 的异常中恢复。
    // 当调用处理者的时候，协程已经完成并带有相应的异常。通常，该处理者用于记录异常，
    // 显示某种错误消息，终止或重新启动应用程序。
    //
    // CoroutineExceptionHandler 仅在未捕获的异常上调用 — 没有以其他任何方式处理的异常。
    val handler = CoroutineExceptionHandler { _, exception ->
        println("CoroutineExceptionHandler got: $exception")
    }

    val job = GlobalScope.launch(handler) { // 根协程，运行在 GlobalScope 中
        throw AssertionError()
    }
    val deferred = GlobalScope.async(handler) { // 同样是根协程，但使用 async 代替了 launch
        throw ArithmeticException() // 没有打印任何东西，依赖用户去调用 deferred.await()
    }
    joinAll(job, deferred)

    println("runBlocking --> end")
}